package com.alphay.boot.common.mybatis.mapper;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.toolkit.Db;

import java.util.Collection;
import java.util.List;

/**
 * 在 MyBatis Plus 的 BaseMapper 的基础上拓展，提供更多的能力
 *
 * <p>为什么继承 MPJBaseMapper 接口？支持 MyBatis Plus 多表 Join 的能力。
 */
public interface BaseMapperX<T> extends BaseMapper<T> {

  default T selectOne(String field, Object value) {
    return selectOne(new QueryWrapper<T>().eq(field, value));
  }

  default T selectOne(SFunction<T, ?> field, Object value) {
    return selectOne(new LambdaQueryWrapper<T>().eq(field, value));
  }

  default T selectOne(String field1, Object value1, String field2, Object value2) {
    return selectOne(new QueryWrapper<T>().eq(field1, value1).eq(field2, value2));
  }

  default T selectOne(
      SFunction<T, ?> field1, Object value1, SFunction<T, ?> field2, Object value2) {
    return selectOne(new LambdaQueryWrapper<T>().eq(field1, value1).eq(field2, value2));
  }

  default Long selectCount() {
    return selectCount(new QueryWrapper<T>());
  }

  default Long selectCount(String field, Object value) {
    return selectCount(new QueryWrapper<T>().eq(field, value));
  }

  default Long selectCount(SFunction<T, ?> field, Object value) {
    return selectCount(new LambdaQueryWrapper<T>().eq(field, value));
  }

  default List<T> selectList() {
    return selectList(new QueryWrapper<>());
  }

  default List<T> selectList(String field, Object value) {
    return selectList(new QueryWrapper<T>().eq(field, value));
  }

  default List<T> selectList(SFunction<T, ?> field, Object value) {
    return selectList(new LambdaQueryWrapper<T>().eq(field, value));
  }

  default List<T> selectList(String field, Collection<?> values) {
    return selectList(new QueryWrapper<T>().in(field, values));
  }

  default List<T> selectList(SFunction<T, ?> field, Collection<?> values) {
    return selectList(new LambdaQueryWrapper<T>().in(field, values));
  }

  default List<T> selectList(SFunction<T, ?> leField, SFunction<T, ?> geField, Object value) {
    return selectList(new LambdaQueryWrapper<T>().le(leField, value).ge(geField, value));
  }

  /**
   * 批量插入，适合大量数据插入
   *
   * @param entities 实体们
   */
  default void insertBatch(Collection<T> entities) {
    Db.saveBatch(entities);
  }

  /**
   * 批量插入，适合大量数据插入
   *
   * @param entities 实体们
   * @param size 插入数量 Db.saveBatch 默认为 1000
   */
  default void insertBatch(Collection<T> entities, int size) {
    Db.saveBatch(entities, size);
  }

  default void updateBatch(T update) {
    update(update, new QueryWrapper<>());
  }

  default void updateBatch(Collection<T> entities, int size) {
    Db.updateBatchById(entities, size);
  }
}
